package com.cskaoyan.javase.oop3._1interface._0introduction;

import javafx.animation.Animation;

/**
 * 接口是一种表示对行为抽象的，不受Java单继承限制的，用来作为功能扩展标准的一种引用数据类型。
 * 总之,它仅表示对功能的扩展.
 * 它的定义语法如下：
 * [访问权限修饰符] interface 接口名{}
 * 注意:
 *      1.接口的定义就是把类定义时的class关键字换成了interface
 *      2.接口和类是平行关系的数据类型,都是引用数据类型
 *      3.接口名和类名一样,遵循大驼峰,见名知意
 *       有些程序员习惯在接口名的前面加大写字母"I"
 *       以表示这是一个接口
 *
 * 接口中成员的定义:
 *      接口允许定义抽象方法
 *
 * 接口的"继承"/实现:
 *      接口是可以被一个普通类"继承"的
 *      这样的关系,专有名词,称之为"实现(implements)"
 *      使用关键字implements而不是extends
 *      当然某个类实现接口
 *      接口就是父接口,实现类也是子类
 *      子类会继承得到父接口中的成员(包括抽象方法)
 *      普通类得到接口的抽象方法,也必须实现抽象方法
 *      总之,父接口和实现类之间的关系,看成父类和子类在使用时是可以的,同样存在父类引用指向子类对象
 *      如果某个类既有继承也有实现,应该先继承,再实现
 *
 * 接口的多实现
 *      某个类在继承类时,最多直接继承一个
 *      但是接口不受限制
 *      接口是多实现
 *
 *
 * @since 17:15
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 'ISpecialSkill' is abstract; cannot be instantiated
        // 接口不能new对象,它也是抽象的
        // new ISpecialSkill();
        SuperDog sd = new SuperDog();
        Dog d = new SuperDog();
        Animal a = new SuperDog();
        ISpecialSkill is = new SuperDog();
        is.walkUpRight();
        is = new SuperCat();
        is.walkUpRight();
    }
}

abstract class Animal {
    public abstract void shout();
}

class Cat extends Animal {
    @Override
    public void shout() {
        System.out.println("猫叫");
    }
}

class Dog extends Animal {
    @Override
    public void shout() {
        System.out.println("狗叫");
    }
}

// 这种方式定义超级猫是可以的,但是没有体现"特殊训练"的特殊性,缺少一个标记
class SuperCat extends Cat implements ISpecialSkill {
    // 新增一个直立行走的方法
    @Override
    public void walkUpRight() {
        System.out.println("我是超威蓝猫,我可以直立行走!");
    }
}

class SuperDog extends Dog implements ISpecialSkill, IA {
    @Override
    public void walkUpRight() {
        System.out.println("我是哮天犬,我可以直立行走!");
    }
}

/*
    这种实现方法不行:
        1.Java是单继承,没法继承多个类
        2.这里仅表示对行为的抽象,不能定义为一个类
        3.父类和子类的继承是"is-a"关系,这里没有这种关系
        4.继承层次的祖先类才需要使用抽象类,这里不符合抽象类的使用场景
     于是，我们就迫切需要一种全新的数据类型，这种全新的数据类型：
        1.不强调属性，只强调行为的抽象，"继承"它表示功能的扩展。
        2.在一个类继承某个类后，还能继续"继承"，不受Java单继承限制。
        3.没有"is-a"这种继承关系的限制。
        4.最好还有抽象方法。（因为它能表示规范和标准）
        这种全新的数据类型，就是接口（interface）。
 */
abstract class SpecialSkill {
    public abstract void walkUpRight();
}

interface ISpecialSkill {
    public abstract void walkUpRight();
}

interface IA {
}